package sign

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"fmt"
	"net/url"
)

// GiteeSign Gitee webhook 签名验证算法。
// Step1：把timestamp+"\n"+密钥当做签名字符串，使用HmacSHA256算法计算签名。
// Step2：对上述得到的结果进行 Base64 encode。
// Step3：对上述得到的结果进行 urlEncode，得到最终的签名（需要使用UTF-8字符集）。
func GiteeSign(secret string, timestamp int64) string {
	stringToSign := fmt.Sprintf("%d\n%s", timestamp, secret)
	byteStringToSign := []byte(stringToSign)
	b64 := base64.StdEncoding.EncodeToString(HmacSha256Sign([]byte(secret), byteStringToSign))
	return url.PathEscape(b64)
}

// HmacSha256Sign sha256。
func HmacSha256Sign(secret, msg []byte) []byte {
	h := hmac.New(sha256.New, []byte(secret))
	h.Write(msg)
	return h.Sum(nil)
}
